home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / handlepo.i < prev    next >
Text File  |  1997-10-26  |  6KB  |  190 lines

  1. IMPLEMENTATION MODULE handlePool;
  2.  
  3. (*==============================================================*
  4.  * Modul:               Verwaltet Pool von Datenbank-Handles    *
  5.  * Autor:               Johannes G”ttker-Schnetmann             *
  6.  * erstellt am:         09.04.1992                              *
  7.  * letzte Žnderung am:  12.04.1992                              *
  8.  * Version:             1.0                                     *
  9.  * Interne Version:     V#0002                                  *
  10.  *==============================================================*
  11.  
  12.  Aus grin.i hierhin verlagert, da das Stichwortlistenmodul auch 
  13.  Datenbankhandles ben”tigt.
  14.  
  15.  *----------------------------------------------------------------------------
  16.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)                            
  17.  *----------------------------------------------------------------------------
  18.  * 09.04.92 0001  JGS    Erste Version
  19.  * 12.04.92 0002  JGS    Listenhandling erweitert und verbessert
  20.  *----------------------------------------------------------------------------
  21.  *)
  22.  
  23. IMPORT SYSTEM;
  24. (*-- MM2-Module -----------*)
  25. IMPORT Lists; 
  26. IMPORT Storage;
  27. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  28.  
  29. (*-- Cat-Module -----------*)
  30. IMPORT data;
  31. IMPORT MTE;
  32. FROM Void IMPORT v;
  33.  
  34.  
  35. (* Die Handles fr den Zugriff auf die Datenbank: *)
  36.  
  37. (*
  38. TYPE oneHandlePtr = POINTER TO oneHandleElement;
  39. TYPE oneHandleElement =
  40.        RECORD
  41.          group   : CARDINAL;            (* Gruppennummer *)
  42.          open    : CARDINAL;            (* Anzahl der offenen Fenster dazu *)
  43.          Zugriff : data.OneGroupHandle; (* Zugriffshandle *)
  44.        END;
  45. *)
  46.  
  47. VAR handles : Lists.List;      (* Liste der Zugriffshandles *)
  48.  
  49. (*-- Allgemeine Listenverwaltung ---------------*)
  50.  
  51. PROCEDURE BlankToList(VAR new  : SYSTEM.ADDRESS;
  52.                           size : LONGCARD;
  53.                       VAR list : Lists.List):BOOLEAN;
  54. (* Ein Listenelement an die angegebene Liste anh„ngen *)
  55. VAR err   : BOOLEAN;
  56. BEGIN
  57.   Storage.ALLOCATE(new, size);
  58.   IF new # NIL THEN
  59.     Lists.AppendEntry(list, new, err);
  60.     IF err THEN
  61.       Storage.DEALLOCATE(new, 0);
  62.       RETURN FALSE;
  63.     ELSE
  64.       RETURN TRUE
  65.     END;
  66.   ELSE
  67.     RETURN FALSE
  68.   END;
  69. END BlankToList;
  70.  
  71. PROCEDURE FreeOnePtr(ptr  : SYSTEM.ADDRESS;
  72.                  VAR list : Lists.List);
  73. VAR found : BOOLEAN;
  74. BEGIN
  75.   Lists.FindEntry(list, ptr, found);
  76.   IF found THEN
  77.     Lists.RemoveEntry(list, v.bool);
  78.     Storage.DEALLOCATE(ptr, 0);
  79.   ELSE
  80.     MTE.InfoAlert(MTE.listError1, 'Fenster-Liste', MTE.listError2);
  81.   END;
  82. END FreeOnePtr;
  83.  
  84. PROCEDURE FindEntry(data     : SYSTEM.ADDRESS;
  85.                     condProc : Lists.LCondProc;
  86.                     list     : Lists.List;
  87.                 VAR ptr      : SYSTEM.ADDRESS):BOOLEAN;
  88. VAR found : BOOLEAN;
  89. BEGIN
  90.   found := FALSE;
  91.   Lists.ResetList(list);
  92.   Lists.ScanEntries(list, Lists.forward, condProc, data, found);
  93.   IF found THEN
  94.     ptr := Lists.CurrentEntry(list);
  95.   END;
  96.   RETURN found  
  97. END FindEntry;
  98.  
  99. (*-- Spezielle Datenbankhandleliste ------------*)
  100.  
  101. PROCEDURE SearchDataHandle(gruppe : CARDINAL;
  102.                        VAR handle : oneHandlePtr):BOOLEAN;
  103. (* Handle-Liste nach einem Eintrag der Gruppe <gruppe> durchsuchen *)
  104.  
  105. (*$Z-,A+*)
  106.   PROCEDURE condProc(e, i : SYSTEM.ADDRESS):BOOLEAN;
  107.   (* Abbruchprozedur, wie in <Lists> gefordert *)
  108.   BEGIN
  109.     RETURN oneHandlePtr(e)^.group = gruppe
  110.   END condProc;
  111. (*$Z=,A=*)
  112. VAR found : BOOLEAN;
  113. BEGIN
  114.   Lists.ResetList(handles);
  115.   Lists.ScanEntries(handles, Lists.forward, condProc, SYSTEM.ADR(gruppe), found);
  116.   IF found THEN
  117.     handle := Lists.CurrentEntry(handles);
  118.   END;
  119.   RETURN found
  120. END SearchDataHandle;
  121.  
  122. PROCEDURE GetOneDatahandle(gruppe : CARDINAL;
  123.                        VAR handle : oneHandlePtr):BOOLEAN;
  124. (* Erst die bestehende Liste nach schon offenen Handles durchsuchen,
  125.  * falls dort nicht gefunden, versuchen ein neues zu ”ffnen
  126.  *)
  127.  VAR found : BOOLEAN;
  128. BEGIN
  129.   IF SearchDataHandle(gruppe, handle) THEN
  130.     INC(handle^.open); (* jetzt wird es von einem Fenster mehr benutzt *)
  131.   ELSE
  132.     IF BlankToList(handle, SYSTEM.TSIZE(oneHandleElement), handles) THEN
  133.       IF ~data.OpenOneGroup(gruppe, 0, FALSE, handle^.Zugriff) THEN
  134.         (* Hier interessiert nicht, was beim zurckschreiben passiert *)
  135.         Lists.FindEntry(handles, handle, found);
  136.         IF found THEN
  137.           Lists.RemoveEntry(handles, v.bool);
  138.         ELSE
  139.           MTE.InfoAlert(MTE.listError1, 'Handle-Liste', MTE.listError2);
  140.         END;
  141.         DISPOSE(handle);
  142.         RETURN FALSE
  143.       ELSE
  144.         handle^.group := gruppe;
  145.         handle^.open  := 1;
  146.       END;
  147.     ELSE
  148.       RETURN FALSE
  149.     END;
  150.   END;
  151.   RETURN TRUE
  152. END GetOneDatahandle;
  153.  
  154. PROCEDURE FreeOneDataHandle(handle : oneHandlePtr);
  155. (* Nachsehen, ob er noch ben”tigt wird, sonst aus der Liste entfernen *)
  156. VAR found : BOOLEAN;
  157. BEGIN
  158.   IF handle = NIL THEN RETURN END;
  159.   IF handle^.open > 1 THEN (* = wird noch ben”tigt, aber von einem weniger *)
  160.     DEC(handle^.open)
  161.   ELSE (* Wird nicht mehr ben”tigt *)
  162.     data.CloseOneGroup(handle^.Zugriff);
  163.     (* Hier interessiert nicht, was beim zurckschreiben passiert *)
  164.     Lists.FindEntry(handles, handle, found);
  165.     IF found THEN
  166.       Lists.RemoveEntry(handles, v.bool);
  167.     ELSE
  168.       MTE.InfoAlert(MTE.listError1, 'Handle-Liste', MTE.listError2);
  169.     END;
  170.     DISPOSE(handle);
  171.   END;
  172. END FreeOneDataHandle;
  173.  
  174. PROCEDURE InitPool():BOOLEAN;
  175. (* Wird in grin.grinInit aufgerufen, Fehler auch dort angemeckert und braucht *)
  176. (* nicht weiter beachtet zu werden *)
  177. BEGIN
  178.   Lists.CreateList(handles,  v.bool);
  179.   RETURN ~v.bool
  180. END InitPool;
  181.  
  182. PROCEDURE isOneGroupOpen():BOOLEAN;
  183. (* Fragt nach, ob _irgendeine_ Gruppe noch ge”ffnet ist. Insbesondere fr   *)
  184. (* parser.i -> Gruppe offen: Einfgen abbrechen und CAT beenden             *)
  185. BEGIN
  186.   RETURN ~Lists.ListEmpty(handles);
  187. END isOneGroupOpen;
  188.  
  189. END handlePool.
  190.